package cn.iocoder.yudao.module.pay.bill.service;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.api.pay.bill.enums.BillCategoryEnum;
import cn.iocoder.yudao.module.api.pay.bill.enums.BillTypeEnum;
import cn.iocoder.yudao.module.pay.bill.dal.dataobject.PayBillDO;
import cn.iocoder.yudao.module.pay.bill.vo.AppPayBillPageReqVO;
import cn.iocoder.yudao.module.pay.bill.vo.AppPayBillRespVO;
import cn.iocoder.yudao.module.pay.bill.vo.PayBillPageReqVO;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.validation.Valid;

/**
 * 账单 Service 实现类
 *
 * @author yshop
 * @author 山野羡民
 */
public interface PayBillService extends IService<PayBillDO> {

    /**
     * 关联编号是否存在
     *
     * @param userId   用户编号
     * @param relateId 关联id
     */
    boolean exists(Long userId, String relateId);

    /**
     * 增加支出流水
     *
     * @param userId   用户编号
     * @param category 资产种类
     * @param type     明细类型
     * @param number   当前变动的资产值，若是人民币则单位为分
     * @param mark     备注
     * @param relateId 关联id
     * @param extendField 扩展信息
     */
    void expendAsync(Long userId, BillCategoryEnum category, BillTypeEnum type, Double number, String mark, String relateId, String extendField);

    /**
     * 增加收入流水
     *
     * @param userId   用户编号
     * @param category 资产种类
     * @param type     明细类型
     * @param number   当前变动的资产值，若是人民币则单位为分
     * @param mark     备注
     * @param relateId 关联id
     */
    default void incomeAsync(Long userId, BillCategoryEnum category, BillTypeEnum type, Double number, String mark, String relateId) {
        incomeAsync(userId, category, type, number, mark, relateId, "");
    }

    /**
     * 增加收入流水
     *
     * @param userId      用户编号
     * @param category    资产种类
     * @param type        明细类型
     * @param number      当前变动的资产值，若是人民币则单位为分
     * @param mark        备注
     * @param relateId    关联id
     * @param extendField 扩展信息
     */
    void incomeAsync(Long userId, BillCategoryEnum category, BillTypeEnum type, Double number, String mark, String relateId, String extendField);

    /**
     * 获得账单分页
     *
     * @param pageReqVO 分页查询
     * @return 账单分页
     */
    PageResult<PayBillDO> getBillPage(PayBillPageReqVO pageReqVO);

    /**
     * 获取账单
     *
     * @param userId 用户编号
     * @param reqVO  请求参数
     */
    PageResult<AppPayBillRespVO> getBillPage(Long userId, @Valid AppPayBillPageReqVO reqVO);

    /**
     * 获取账单数值和
     *
     * @param userId 用户编号
     * @param reqVO  请求参数
     */
    Double getNumberSum(Long userId, AppPayBillPageReqVO reqVO);

    /**
     * 获取账单收入数值和
     *
     * @param userId 用户编号
     * @param reqVO  请求参数
     */
    Double getInNumberSum(Long userId, AppPayBillPageReqVO reqVO);

    /**
     * 获取账单支出数值和
     *
     * @param userId 用户编号
     * @param reqVO  请求参数
     */
    Double getOutNumberSum(Long userId, AppPayBillPageReqVO reqVO);

    /**
     * 根据关联id查询账单
     * @param relateId 关联id
     * @return 账单
     */
    PayBillDO selectByRelateId(String relateId);

}
